package com.hh.bss.util;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class FileHelper {
	private static final Log logger = LogFactory.getLog(FileHelper.class);
	private static final String LINE_SEPARATOR = "\r\n";//分隔符
	/**
	 * 检查某文件或目录是否存在
	 * @param file String : 文件或目录的绝对路径
	 * @return boolean : 如果存在则返回true，否则返回false
	 */
	public static boolean isExist(final String file){
		File f = new File(file);
		if(f == null || f.exists() == false) return false;
		return true;
	}
	public static byte[] getFileBytes(File file) {
		byte[] myData = null;
		InputStream input = null;
		try {
			input = new BufferedInputStream(new FileInputStream(file));
			ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
			int ch = 0;
			while ((ch = input.read()) != -1) {
				byteArray.write(ch);
			}

			myData = byteArray.toByteArray();

		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			   try{if (input!=null)input.close();}catch(Exception ex1){ex1.printStackTrace();}	
			}
		return myData;
	}
	/**
	 * 得到某文件（某目录下所有文件）的大小
	 * @param file File : 文件或路径名
	 * @param child boolean : 是否计算子目录
	 * @return long : 文件大小（字节）
	 */
	public static long getTotalSize(final File file, final boolean child){
		if(file == null || file.exists() == false) return 0;
		long totalSize = 0;
		if(file.isFile() == true){
			//如果是文件，直接返回其大小
			return file.length();
		}else if(file.isDirectory() == true){
			//目录
			File[] files = file.listFiles();
			//统计得到目录内所有文件的大小之和
			for (int i = 0; i < files.length; i++){
				if(files[i].isFile() == true){
					totalSize += files[i].length();
				}else if(files[i].isDirectory() == true && child == true){
					//如果是子目录，则继续往里找
					totalSize += getTotalSize(files[i], true);
				}
			}
			return totalSize;
		}else{
			return 0;
		}
	}
	/**
	 * 得到某文件（某目录下所有文件）的大小
	 * @param path String : 文件或目录名
	 * @param child boolean : 是否计算子目录
	 * @return long : 文件大小（字节）
	 */
	public static long getTotalSize(final String path, final boolean child){
		File file = new File(path);
		return getTotalSize(file, child);
	}
	/**
	 * 得到某文件（某目录下所有文件，包含子目录内的文件）的大小
	 * @param path String : 文件或目录名
	 * @return long : 文件大小（字节）
	 */
	public static long getTotalSize(final String path){
		return getTotalSize(path, true);
	}
	/**
	 * 删除指定文件或目录
	 * @param file File : 文件或目录的路径
	 */
	public static void delete(File file){
		if(file == null || file.exists() == false) return;
		if(file.isFile()){
			//文件，直接删除
			file.delete();
			return;
		}else if(file.isDirectory()){
			//目录
			File[] childs = file.listFiles();
			for (int i = 0; i < childs.length; i++){
				delete(childs[i]);
			}
			file.delete();
		}
	}
	/**
	 * 删除指定文件或目录
	 * @param file File : 文件或目录的路径
	 */
	public static void delete(final String file){
		File f = new File(file);
		delete(f);
	}
	/**
	 * 读取文本文件内容，以 LINE_SEPARATOR 为换行符
	 * @param file String : 文件绝对路径
	 * @return StringBuffer : 包含所有的文件内容
	 */
	public static StringBuffer read(final String file){
		return read(file, LINE_SEPARATOR,"GBK");
	}
	public static StringBuffer read(final String file,String encode){
		return read(file, LINE_SEPARATOR,encode);
	}
	/**
	 * 创建目录
	 * @param dirs String : 目录绝对路径
	 */
	public static void mkdir(final String dirs){
		new java.io.File(dirs).mkdirs();
	}
	/**
	 * 读取文本文件内容
	 * @param file String : 文件绝对路径
	 * @param line String : 换行符
	 * @return StringBuffer : 包含所有的文件内容
	 */
	public static StringBuffer read(final String file, final String line,String encode){
		StringBuffer sb = new StringBuffer();
		try{
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file),encode));
			String buffer = null;
			do{
				buffer = br.readLine();
				if(buffer != null){
					sb.append(buffer);
					sb.append(line);
				}
			}while(buffer != null);
			//替换相应的字符串
			return sb;
		}catch(IOException ioe){
			logger.warn("read("+file+","+line+"):IOException-->"+ioe.getMessage());
			return null;
		}
	}
	
	/**
	 * 写入文件
	 * @param file String : 文件路径(绝对路径)
	 * @param content String : 要写入的文件内容
	 * @return boolean : 成功写入返回true，否则返回false
	 */
	public static boolean write(final String file,final String content){
		BufferedWriter writer = null;
		try{
			File f = new File(file);
			if(!f.getParentFile().exists()) f.getParentFile().mkdirs();
			writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
			writer.write(content);
			writer.flush();
			return true;
		}catch(IOException ioe){
			logger.error("write("+file+"):IOException-->"+ioe.getMessage());
			return false;
		}finally{
			try{
				if(writer != null) writer.close();
			}catch(IOException ioe){
				logger.error("close("+file+"):IOException-->"+ioe.getMessage());
			}
		}
	}
	/**
	 * 得到文件扩展名
	 * @param fileName String : 文件名
	 * @return String : 扩展名，如果没有扩展名，则返回null
	 */
	public static String getExtendName(String fileName){
		return getExtendName(fileName,null);
	}
	/**
	 * 得到文件的扩展名
	 * @param fileName String : 文件名
	 * @param defaultValue String : 如果没有扩展名，则返回此默认值
	 * @return String : 相应文件的扩展名
	 */
	public static String getExtendName(String fileName,String defaultValue){
		if(fileName == null) return null;
		String[] names = fileName.split("\\.");
		if(names == null || names.length <= 1) return defaultValue;
		return names[names.length - 1];		
	}
	/**
	 * 复制文件
	 * @param source String : 源文件（全路径）
	 * @param dist String : 目的文件（全路径）
	 * @return boolean : 复制成功返回true，否则返回false
	 */
	public static boolean copyFile(String source,String dist){
		InputStream sourceStream = null;
		FileOutputStream distStream = null;
		try{
			File sourceFile = new File(source);			
			File distFile = new File(dist);
			if(!distFile.getParentFile().exists()) distFile.getParentFile().mkdirs();
			distFile.createNewFile();
	    distStream = new FileOutputStream(distFile);
	    byte buff[] = new byte[(int)sourceFile.length()];
	    sourceStream = new FileInputStream(sourceFile);
	    sourceStream.read(buff);
	    distStream.write(buff);
	    return true;
		}catch(IOException ioe){
			logger.error("copyFile("+source+","+dist+"):"+ioe.getMessage());
			return false;
		}finally{
			try{
				if(sourceStream != null) sourceStream.close();
				if(distStream != null) distStream.close();
			}catch(IOException ioe){
				logger.error("copyFile("+source+","+dist+"):"+ioe.getMessage());
			}
		}
	}
	/**
	 * 
	 * @param reqURL
	 * @param fileName
	 * @deprecated 请使用fileGrab代替
	 * @return
	 */
	public static boolean fileGrabber(String reqURL,String fileName){
		return fileGrab(reqURL,fileName);
	}
	/**
	 * 抓取文件(从网络上)
	 * @param reqURL String : 网络文件路径
	 * @param fileName String : 本地文件路径
	 * @return boolean : 抓取成功返回true,否则返回false
	 */	
	public static boolean fileGrab(String reqURL,String fileName){
		InputStream is = null;
		OutputStream os = null;
		try{
			is = URLHelper.getDocumentAsInputStream(reqURL);
			File parent = new File(fileName);
			parent.getParentFile().mkdirs();
			os = new FileOutputStream(fileName);			
			byte[] buff = new byte[1024];
			int result = -1;
			while( (result = is.read(buff)) != -1){
				os.write(buff,0,result);
			}
			is.close();
			os.close();
			return true;
		}catch(IOException ioe){
			logger.error("IOException:"+ioe.getMessage());
			return false;
		}finally{
			//释放资源
			if(is != null){
				try{is.close();}catch(IOException ioe){
					logger.error("IOException:"+ioe.getMessage());
				}
			}
		}		
	}	
	private FileHelper(){
		
	}
	public static void main(String[] args) throws IOException{
		
		FileHelper.fileGrab("http://jvc-4.jvc.163.com:8180/fmsupload/FileUploadServlet?type=play&videoname=orz-1134055741_1197878890158.flv", "D:\\1.flv");
		System.out.println("ddd");
	}
}
